//Subject.h
#ifndef _SUBJECT_H_
#define _SUBJECT_H_

#include <list>
#include <string>

using namespace std;

typedef string State;
class Observer;

class Subject
{
public:
    virtual ~Subject();
    virtual void Attach(Observer* obv);
    virtual void Detach(Observer* obv);
    virtual void Notify();
    virtual void SetState(const State& st) = 0;
    virtual State GetState() = 0;

protected:
    Subject();

private:
    list<Observer* >* _obvs;
};

class ConcreteSubject:public Subject
{
public:
    ConcreteSubject();
    ~ConcreteSubject();
    State GetState();
    void SetState(const State& st);

protected:

private:
    State _st;
};

#endif //~_SUBJECT_H_ 
